package com.cmii.sjw.department.control.jsc.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cmii.sjw.department.control.jsc.model.dto.RoleDTO;
import com.cmii.sjw.department.control.jsc.model.dto.RoleQueryDTO;
import com.cmii.sjw.department.control.jsc.model.entity.Role;
import com.cmii.sjw.department.control.jsc.model.vo.RoleCockpitVO;
import com.cmii.sjw.department.control.jsc.service.RoleCockpitService;
import com.cmii.sjw.department.control.jsc.service.RoleService;
import com.cmii.sjw.department.control.jsc.util.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 角色管理控制器
 *
 * @Author jfh
 * @Date 2025-04-08 周二 15:37
 * @Version 1.0
 */
@Slf4j
@RestController
@CrossOrigin
@RequestMapping("/sys/role")
public class RoleController {

    @Autowired
    private RoleService roleService;

    @Autowired
    private RoleCockpitService roleCockpitService;

    /**
     * 保存角色和菜单关联关系
     *
     * @param roleDTO 角色和菜单ID列表
     * @return 保存结果
     */
    @PostMapping("/save")
    public Result saveRole(@RequestBody RoleDTO roleDTO) {
        boolean success = roleService.saveRoleWithMenus(roleDTO.getRole(), roleDTO.getMenuIds());
        if (success) {
            if (roleDTO.getCockpitIds() != null && !roleDTO.getCockpitIds().isEmpty()) {
                roleCockpitService.saveOrUpdateRoleCockpits(roleDTO.getRole().getId(), roleDTO.getCockpitIds());
            }
            return Result.success();
        } else {
            return Result.error("保存角色失败");
        }
    }

    /**
     * 根据角色ID获取菜单ID列表、 Cockpit 指标权限ID列表
     *
     * @param roleId 角色ID
     * @return 菜单ID列表、Cockpit 指标权限ID列表
     */
    @PostMapping("/menuIds")
    public Result<RoleCockpitVO>  getMenuIdsByRoleId(@RequestParam Long roleId) {
        List<Long> menuIds = roleService.getMenuIdsByRoleId(roleId);
        List<Long> cockpitIds =roleCockpitService.getCockpitIdsByRole(roleId);
        RoleCockpitVO vo = new RoleCockpitVO(menuIds, cockpitIds);
        return Result.success(vo);
    }

    /**
     * 分页查询角色列表
     *
     * @param queryDTO 查询条件
     * @return 角色分页列表
     */
    @PostMapping("/page")
    public Result<Page<Role>> getRolePage(RoleQueryDTO queryDTO) {
        Page<Role> page = roleService.getRolePage(queryDTO);
        return Result.success(page);
    }

    /**
     * 删除角色
     *
     * @param id 角色ID
     * @return 删除结果
     */
    @PostMapping("/delete")
    public Result deleteRole(@RequestParam Long id) {
        boolean success = roleService.deleteRole(id);
        if (success) {
            // 删除该角色的 cockpit 指标权限
            roleCockpitService.deleteRoleCockpit(id);
            return Result.success();
        } else {
            return Result.error("删除角色失败");
        }
    }

    /**
     * 更新角色状态 0 正常 1 禁用
     *
     * @param id     角色ID
     * @param status 角色状态
     * @return 更新结果
     */
    @PostMapping("/updateStatus")
    public Result updateRoleStatus(@RequestParam Long id, @RequestParam Integer status) {
        boolean success = roleService.updateRoleStatus(id, status);
        return success ? Result.success() : Result.error("更新状态失败");
    }

    /**
     * 分配用户到角色
     * 先删除角色下的所有用户，再添加新的用户
     * 注意：如果角色下的用户较多，可能会影响性能，建议使用批量操作
     *
     * @param roleId
     * @param userIds
     * @return
     */
    @PostMapping("/assignUsers")
    public Result assignUsersToRole(@RequestParam Long roleId, @RequestBody List<Long> userIds) {
        boolean success = roleService.assignUsersToRole(roleId, userIds);
        return success ? Result.success() : Result.error("分配用户失败");
    }

    /**
     * 批量角色禁用
     */
    @PutMapping("/batchDisable")
    public Result batchDisableStatus(@RequestBody Long[] ids) {
        boolean success = roleService.batchDisableStatus(ids);
        return success ? Result.success() : Result.error("批量角色禁用失败");
    }

    /**
     * 批量角色启用
     */
    @PutMapping("/batchActivation")
    public Result batchActivationStatus(@RequestBody Long[] ids) {
        boolean success = roleService.batchActivationStatus(ids);
        return success ? Result.success() : Result.error("批量角色启用失败");
    }
}
